package com.wowangz.cms.syscore.autotask.manager;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import com.wowangz.cms.common.utils.SysConstant;
import com.wowangz.cms.syscore.InitEnvironment;
import com.wowangz.cms.syscore.autotask.pojo.Autotask;
import com.wowangz.cms.syscore.utils.SpringUtil;
import com.wowangz.cms.syscore.utils.SystemConfig;

/**
 * 启动加载系统定义的自动任务
 * @author user
 *
 */
public class AutoTaskRunManager {
	
	/**
	 * 标识自动任务的键
	 */
	public static final String KEY_AUTOTASK="AutotaskID";
	//自动任务加载次数
	private static long repeat_count = 0;
	private static Object lock=new Object();

	//add by yoyo 获取配置的运行自动任务服务名
	private static SystemConfig systemConfig=new SystemConfig("autoTaskRunServer");
	private static Map systemConfigMap = systemConfig.getKeyValueMap();
	
	private static String TRIGGERGROUP = "TRIGGER_" + Scheduler.DEFAULT_GROUP;
	
	public static long getRepeat_count()
	{
	
		return repeat_count;
	}

	
	public static void setRepeat_count(long repeat_count)
	{
	
		AutoTaskRunManager.repeat_count = repeat_count;
	}

	public AutoTaskRunManager() { 

	}

	public void execute() {
//		DriverManagerDataSource dataSource = (DriverManagerDataSource)SpringUtil.getBean("publicDataSource"); 
//		SqlSession sqlsession = InitEnvironment.getSqlSessionFactory().openSession(dataSource,true);
//		try {
//			synchronized(lock){
//				if(repeat_count==0){
//					List autotasklist = sqlsession.selectList("Autotask.tasklist");
//					if(autotasklist!=null&&autotasklist.size()>0){
//						for(int i = 0; i < autotasklist.size(); i++){
//							Autotask sysautotask = (Autotask) autotasklist.get(i);
//								if(sysautotask.getExecutestatus().longValue()==SysConstant.ExecuteStatus.RUN){
//									sysautotask.setExecutestatus(SysConstant.ExecuteStatus.STOP);
//									sqlsession.update("Autotask.updatetask_executestatus",sysautotask);
//								}
//						}
//					}
//					
//				}
//				repeat_count++;
//			}
//			System.out.println("[系统配置自动任务]开始启动全部系统自动任务!");
//			// 初始化执行计划工厂
//			SchedulerFactory schedulerFactory = new StdSchedulerFactory();
//			// 从执行计划工厂得到一个调度计划
//			Scheduler scheduler = schedulerFactory.getScheduler();
//			//查询自动任务表，得到自动任务表的list
//			List autotasklist = sqlsession.selectList("Autotask.tasklist");
//			for (int i = 0; i < autotasklist.size(); i++)
//			{
//				Autotask sysautotask = (Autotask) autotasklist.get(i);
//				//add by yoyo 判断获取的自动任务服务名和配置文件的服务名是否一致,如果不一致，把运行状态置为停止
//				String servername = (String)systemConfigMap.get("servername");
//				if(servername == null || !servername.equalsIgnoreCase(sysautotask.getServername()))
//				{
//					sysautotask.setTaskstatus(SysConstant.TaskStatus.STOPUSING);
//				}
//				try
//				{
//					Long taskstatus=sysautotask.getTaskstatus();
//					//如果任务的状态为2,表示允许执行,则将自动任务加入到容器中,并执行自动任务
//					if(taskstatus==SysConstant.TaskStatus.ACTIVATE){
//		                //通过名字和组得到jobDectail
//						JobDetail jobdetail=scheduler.getJobDetail(sysautotask.getCode(), Scheduler.DEFAULT_GROUP);
//						//得到触发器
//						CronTrigger cronTrigger=(CronTrigger)scheduler.getTrigger(sysautotask.getCode()+"_cronTrigger", TRIGGERGROUP);
//						//如果自动任务没有在容器中运行,生成一个运行的自动任务
//						if(jobdetail==null||cronTrigger==null){	
//		                      //根据任务表的设置动态生成一个任务调度
//							  startNewJob(sysautotask,scheduler);
//						}
//						//如果自动任务已经在容器中运行,而且执行模式发生了变化
//						else if(jobdetail!=null&&cronTrigger!=null)
//						{
//		                    //获得执行模式
//							String cronTriggerExecuteModel=cronTrigger.getCronExpression();
//							//如果运行中的自动任务的执行模式产生了变化
//							if(!sysautotask.getExecutemodel().equals(cronTriggerExecuteModel)){
//								scheduler.pauseTrigger(cronTrigger.getName(), TRIGGERGROUP);// 停止触发器   
//								scheduler.unscheduleJob(cronTrigger.getName(), TRIGGERGROUP);// 移除触发器 
//								//删除原有任务
//								scheduler.deleteJob(jobdetail.getName(),Scheduler.DEFAULT_GROUP);
//								//按新的执行模式增加新任务
//								startNewJob(sysautotask,scheduler);
//							}
//						}
//					}
//					//如果任务的状态为1,表示不允许执行,则停止自动任务,并从容器中删除
//					else{
//						if(taskstatus==SysConstant.TaskStatus.STOPUSING){
//							//通过名字和组得到jobDectail
//							JobDetail jobdetail=scheduler.getJobDetail(sysautotask.getCode(), Scheduler.DEFAULT_GROUP);
//							//得到触发器
//							CronTrigger cronTrigger=(CronTrigger)scheduler.getTrigger(sysautotask.getCode()+"_cronTrigger", TRIGGERGROUP);
//							//如果自动任务已经在容器中运行
//							if(jobdetail!=null&&cronTrigger!=null){
//								scheduler.pauseTrigger(cronTrigger.getName(), TRIGGERGROUP);// 停止触发器   
//								scheduler.unscheduleJob(cronTrigger.getName(), TRIGGERGROUP);// 移除触发器 
//								//如果schedular是活动的
//								scheduler.deleteJob(jobdetail.getName(),Scheduler.DEFAULT_GROUP);
//							}
//						}
//					}
//				}
//				catch(Exception e){
//					if(sysautotask!=null){
//					System.out.println("启动code为"+sysautotask.getCode()+"的系统配置自动任务出错,原因:"+e.getMessage());
//					}
//				}
//			}
//            //启动执行所有的计划中的jobdetail
//			if(!scheduler.isStarted()){
//				 scheduler.start();
//			}
//			System.out.println("[系统配置自动任务]全部系统自动任务启动完成!");
//
//		} 
//		catch (Exception e) {
//			e.printStackTrace();
//            System.out.println("启动系统配置自动任务出错,原因:"+e.getMessage());
//		}finally
//		{
//			if (sqlsession!=null) {
//				sqlsession.close();
//			}
//		}
		
	}
	
	
	/**
	 * 启动新任务
	 * @param sysautotask
	 * @param scheduler
	 * @throws Exception
	 */
	private void startNewJob(Autotask sysautotask,Scheduler scheduler) throws Exception{
        //根据任务表的设置动态生成一个任务调度
		String code = sysautotask.getCode();
		//得到要执行的类名
		String executeClass = sysautotask.getExecuteclass();
		//得到要执行的cronTrigger模式
		String executeModel = sysautotask.getExecutemodel();
		Class  sysautotasckClass = Class.forName(executeClass);
		// 产生一个jobdetail
		JobDetail jobDetail2 = new JobDetail(code,
				Scheduler.DEFAULT_GROUP, sysautotasckClass);
		jobDetail2.getJobDataMap().put(KEY_AUTOTASK, sysautotask.getId());
		// 产生一个触发器
		CronTrigger cronTrigger2 = new CronTrigger(
				code + "_cronTrigger", TRIGGERGROUP);
		// 设置触发器的模式CronExpression
		CronExpression cronexpression = new CronExpression(executeModel.trim());
		cronTrigger2.setCronExpression(cronexpression);
		// 将job加入到执行计划中
		scheduler.scheduleJob(jobDetail2, cronTrigger2);
	}

}
